ENTREGA ACTIVIDAD 1¶

Daniela Stephania Lombana Garcia

PRIMER PUNTO¶

Se recopilan dos conjuntos de datos demográficos y educativos de las APIs:

  • Datos Abiertos Colombia
  • Sistema Nacional de Información de Educación Superior (SNIES)

El análisis de los datos demográficos y educativos en Colombia, tiene como objetivo identificar tendencias y oportunidades relacionadas con los posgrados en el país. Al cruzar esta información, se pueden obtener valiosos insights sobre la distribución geográfica de matriculados, las preferencias de los estudiantes, las variaciones temporales y la identificación de brechas en la oferta y demanda de programas de posgrado.

Datos Abiertos Colombia¶

Nombres del documento: "MEN_MATRICULA_ESTADISTICA_ES"

Este conjunto de datos abarca el período desde 2015 hasta 2020 y proporciona información relevante sobre la matrícula en instituciones de educación superior en Colombia. Fue suministrado por el Ministerio de Educación Nacional y contiene detalles como la última actualización, vistas, descargas, licencia, entre otros. Además, consta de las siguientes características:

  • Filas: 196K
  • Columnas: 26

Cada fila representa una estadística de matrícula en educación superior con oferta educativa.

Más detalles en la URL de documentación -> (http://www.mineducacion.gov.co/sistemasdeinformacion/1735/w3-propertyname-2672.html)

En la siguiente imagen se observa la busqueda correspondiente:

image.png

Open Refine - Para la limpieza de datos del documento: "MEN_MATRICULA_ESTADISTICA_ES"

1. Para el presente documento, es necesario restringir la información exclusivamente a posgrados (Especialización, Maestría y Doctorado), excluyendo cualquier registro correspondiente a pregrado. En este contexto, el campo ID_NIVEL está dividido en '1' para pregrado y '2' para posgrados; por lo tanto, procederemos a filtrar únicamente los posgrados.

Estos ajustes en el documento facilitan la obtención de la información necesaria para la consolidación de datos.

image.png

image.png

image.png

2. Se realizó una conversión del número a letras, asignando el valor '2' al campo de 'Posgrados' y cambiando el nombre del campo ID_NIVEL a NIVEL_ACADEMICO.

Se debe cambiar el tipo de la variable de la celda; inicialmente era un entero (int), pero ahora debe cambiarse a texto.

image.png

image.png

image.png

3. En la ID_METODOLOGIA se buscó información sobre la escala en la metodología y se obtuvo lo siguiente:

  • Modalidad 1: Presencial. Implica asistir a clases en un centro educativo donde se ofrecen ciclos formativos de grado básico, medio y superior.

  • Modalidad 2: Dual. Los estudiantes combinan la formación teórica en el aula con la práctica en una empresa. El primer año se realiza en el centro educativo y el segundo año en la empresa, aplicable a ciclos de grado medio y superior.

  • Modalidad 3: Distancia. Permite estudiar de manera flexible con clases en línea y autoaprendizaje, accesibles en cualquier lugar y hora.

  • Modalidad 4: Modalidad mixta. Algunos proyectos educativos permiten asistir a clases tanto presenciales como virtuales simultáneamente. Esta modalidad combina flexibilidad y herramientas para el desarrollo académico.

Se realizará el cambio de "Modalidad mixta" a "Dual" y se modificarán los números por letras en la columna denominada "MODALIDAD".

Se debe cambiar el tipo de la variable de la celda; inicialmente era un entero (int), pero ahora debe cambiarse a texto.

image.png

image.png

image.png

image.png

4. En el nivel de formación se identificaron diferentes códigos que corresponden a diferentes tipos de programas educativos:

  • Los números 1, 10, 7 y 8 corresponden a programas de Especialización y se agruparán bajo el nombre de 'Especialización Universitaria'.
  • El número 2 corresponde a programas de 'Maestria'.
  • El número 3 corresponde a programas de 'Doctorado'.

Cada uno de ellos será convertido de números a letras y su título será 'NIVEL_DE_FORMACIÓN'.

Se debe cambiar el tipo de la variable de la celda; inicialmente era un entero (int), pero ahora debe cambiarse a texto.

image.png

image.png

image.png

image.png

image.png

5. Finalmente, se cambian los títulos de las columnas, eliminando comas, tildes, espacios y otros elementos, para evitar errores al realizar el análisis.

image.png

image.png

image.png

SNIES¶

Nombre del documento: "Programas"

Este informe contiene datos de caracterización del registro calificado del programa académico de educación superior, gestionado por la Subdirección de Aseguramiento de la Calidad de la Educación Superior a través del sistema SACES (Soporte al Aseguramiento de la Calidad de la Educación Superior). Además, consta de las siguientes características:

  • Filas: 7.902
  • Columnas: 39

Cada fila representa una estadística de total de programas en educación superior.

Se seleccionaron los siguientes filtros para la búsqueda efectiva:

  • Estado de la Institución: Activos
  • Estado del Programa: Activos
  • Nivel Académico: Posgrados

Más detalles en la URL de documentación -> (https://hecaa.mineducacion.gov.co/consultaspublicas/programas)

En la siguiente imagen se observa la busqueda correspondiente:

image.png

Open Refine - Para la limpieza de datos del documento: "Programas"

1. Se obvervan varias columnas vacias (Sin información), por lo que se procede a eliminar las siguientes: REGISTRO_UNICO, JUSTIFICACION, JUSTIFICACION_DETALLADA, VIGENCIA TRANSITORIA y OBSERVACIÓN DECRETO 1174/23.

image.png

2. Se aplicó un filtro a la columna (CARÁCTER_ACADÉMICO), seleccionando únicamente las universidades de Colombia.

Posteriormente, identificamos 6.370 registros que contenían el carácter académico ‘universidad’. Para preservar únicamente estos datos, marcamos con banderas aquellos que incluían ‘universidad’ y excluimos los demás. Luego, para eliminar los registros no deseados, aplicamos el filtro ‘facet by blank’, accedimos a la opción ‘All’ en la parte superior de la columna y seleccionamos ‘Edit rows’ -> ‘Remove matching rows’.

image.png

image.png

3. En el ámbito de la formación, se requieren varios cambios. En primer lugar, se observa que el término ‘universitario’ hace referencia a una especialización, por lo que se sugiere editar su nombre para que se incluya en el grupo de ‘Especialización universitaria’.

Por otro lado, se han identificado diversas especializaciones, por lo que se propone unificarlas bajo la categoría de ‘Especialización universitaria’.

Cabe mencionar que solo se considerarán especializaciones, maestrías y doctorados, ya que nos enfocamos exclusivamente en posgrados.

image.png

image.png

4. Al igual que en el punto anterior, actualmente se presentan tres modalidades: dual, presencial y virtual. Para facilitar su análisis, se propone unificarlas en grupos.

image.png

image.png

5. Se procede a modificar los títulos de las columnas clave, considerando que son idénticos al documento de Datos Abiertos Colombia, excepto que uno tenía un nombre diferente al otro.

Finalmente, se cambian los títulos de las columnas, eliminando comas, tildes, espacios y otros elementos, para evitar errores al realizar el análisis.

image.png

image.png

image.png

image.png

image.png

SEGUNDO PUNTO¶

Se emplean bibliotecas para la integración de datos provenientes de diversas fuentes y formatos en los conjuntos de datos trabajados en el punto anterior, con el fin de realizar una combinación entre dos conjuntos de datos (usando Pandas).

Para lograrlo, seguimos los siguientes pasos:

1. Se importa la biblioteca pandas para poder leer conjuntos de datos desde GitHub

In [ ]:
import pandas as pd
In [ ]:
url = 'https://raw.githubusercontent.com/DanielaLombana27/proyecto/main/programas.csv'

El primer conjunto de datos se llamará 'programas'.

In [ ]:
programas = pd.read_csv(url)
In [ ]:
programas
Out[ ]:
IES_PADRE CODIGO_INSTITUCION NOMBRE_INSTITUCION ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA TITULO_OTORGADO ... MODALIDAD NUMERO_CREDITOS NUMERO_PERIODOS_DE_DURACION PERIODICIDAD SE_OFRECE_POR_CICLOS_PROPEDEUT PERIODICIDAD_ADMISIONES PROGRAMA_EN_CONVENIO DEPARTAMENTO_OFERTA_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA COSTO_MATRICULA_ESTUD_NUEVOS
0 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 52729.0 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... Presencial 135.0 8.0 Semestral No Semestral N Bogotá, D.C. Bogotá, D.C. 10424920.0
1 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 107164 107164.0 DOCTORADO EN ADMINISTRACIÓN DOCTOR(A) EN ADMINISTRACIÓN ... Presencial 135.0 8.0 Semestral No Semestral N Bogotá, D.C. Bogotá, D.C. 8908265.0
2 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 55123 55123.0 DOCTORADO EN AGROECOLOGÍA DOCTOR EN AGROECOLOGÍA ... Presencial 120.0 8.0 Semestral No Anual N Bogotá, D.C. Bogotá, D.C. 9558260.0
3 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 55186 55186.0 DOCTORADO EN ANTROPOLOGIA DOCTOR EN ANTROPOLOGIA ... Presencial 149.0 8.0 Semestral No Semestral N Bogotá, D.C. Bogotá, D.C. 10424920.0
4 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52727 52727.0 DOCTORADO EN ARTE Y ARQUITECTURA DOCTOR EN ARTE Y ARQUITECTURA ... Presencial 140.0 8.0 Semestral No NaN N Bogotá, D.C. Bogotá, D.C. 10424920.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
6365 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 54252 54252.0 ESPECIALIZACION EN INVESTIGACION CRIMINAL ESPECIALISTA EN INVESTIGACION CRIMINAL ... Presencial NaN 2.0 Semestral No Sin definir N Santander Bucaramanga 10041545.0
6366 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 54805 54805.0 ESPECIALIZACION EN INVESTIGACION CRIMINAL ESPECIALISTA EN INVESTIGACION CRIMINAL ... Presencial 30.0 2.0 Semestral No Semestral N Santander Bucaramanga NaN
6367 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 109316 109316.0 ESPECIALIZACION EN SEGURIDAD Y SALUD EN EL TRA... ESPECIALISTA EN SEGURIDAD Y SALUD EN EL TRABAJO ... Presencial 30.0 2.0 Semestral No Trimestral N Santander Bucaramanga 9129236.0
6368 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 106358 106358.0 MAESTRÍA EN SEGURIDAD Y SALUD EN EL TRABAJO MAGÍSTER EN SEGURIDAD Y SALUD EN EL TRABAJO ... Presencial 50.0 4.0 Periodos No Por cohorte N Santander Bucaramanga 11006852.0
6369 1101 9933 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 116706 NaN Especialización en Interculturalidad y Gestión... Especialista en Interculturalidad y Gestión Te... ... Presencial 24.0 2.0 Semestral No Anual N Cesar La Paz NaN

6370 rows × 35 columns

In [ ]:
url = 'https://raw.githubusercontent.com/DanielaLombana27/proyecto/main/matriculas.csv'

El segundo conjunto de datos se llamará 'matriculas'.

In [ ]:
matriculas = pd.read_csv(url)
<ipython-input-6-907d7dcc43ef>:1: DtypeWarning: Columns (16) have mixed types. Specify dtype option on import or set low_memory=False.
  matriculas = pd.read_csv(url)
In [ ]:
matriculas
Out[ ]:
CODIGO_INSTITUCION IES_PADRE NOMBRE_INSTITUCION PRICIPAL_O_SECCIONAL ID_SECTOR ID_CARACTER CODIGO_DEPARTAMENTO DEPARTAMENTO CODIGO_MUNICIPIO MUNICIPIO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA ID_GENERO YEAR SEMESTRE TOTAL_MATRICULADOS
0 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 2
1 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 20
2 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 6
3 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 4
4 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 3
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
57028 9926 9926 FUNDACION UNIVERSITARIA INTERNACIONAL DE LA RI... Principal 2 3 11 Bogotá D.C. 11001 Bogotá D.C. ... 69 Administración 11 Bogotá D.C. 11001 Bogotá D.C. 2 2020 1 12
57029 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 827 Ingeniería de sistemas telemática y afines 5 Antioquia 5001 Medellín 1 2020 1 4
57030 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 827 Ingeniería de sistemas telemática y afines 5 Antioquia 5001 Medellín 2 2020 1 1
57031 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 69 Administración 5 Antioquia 5001 Medellín 1 2020 1 25
57032 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 69 Administración 5 Antioquia 5001 Medellín 2 2020 1 20

57033 rows × 26 columns

Se imprime los nombres de las columnas de cada DataSet's

In [ ]:
print(programas.columns)
print(matriculas.columns)
Index(['IES_PADRE', 'CODIGO_INSTITUCION', 'NOMBRE_INSTITUCION',
       'ESTADO_INSTITUCION', 'CARACTER_ACADEMICO', 'SECTOR',
       'CODIGO_SNIES_DEL_PROGRAMA', 'CODIGO_ANTERIOR_ICFES',
       'NOMBRE_DEL_PROGRAMA', 'TITULO_OTORGADO', 'ESTADO_PROGRAMA',
       'RECONOCIMIENTO_DEL_MINISTERIO', 'RESOLUCION_DE_APROBACION',
       'FECHA_DE_RESOLUCION', 'FECHA_EJECUTORIA', 'VIGENCIA_AÑOS',
       'FECHA_DE_REGISTRO_EN_SNIES', 'YEAR', 'CINE_F_2013_AC_CAMPO_AMPLIO',
       'CINE_F_2013_AC_CAMPO_ESPECIFIC', 'CINE_F_2013_AC_CAMPO_DETALLADO',
       'AREA_DE_CONOCIMIENTO', 'NUCLEO_BASICO_DEL_CONOCIMIENTO',
       'NIVEL_ACADEMICO', 'NIVEL_DE_FORMACION', 'MODALIDAD', 'NUMERO_CREDITOS',
       'NUMERO_PERIODOS_DE_DURACION', 'PERIODICIDAD',
       'SE_OFRECE_POR_CICLOS_PROPEDEUT', 'PERIODICIDAD_ADMISIONES',
       'PROGRAMA_EN_CONVENIO', 'DEPARTAMENTO_OFERTA_PROGRAMA',
       'MUNICIPIO_OFERTA_PROGRAMA', 'COSTO_MATRICULA_ESTUD_NUEVOS'],
      dtype='object')
Index(['CODIGO_INSTITUCION', 'IES_PADRE', 'NOMBRE_INSTITUCION',
       'PRICIPAL_O_SECCIONAL', 'ID_SECTOR', 'ID_CARACTER',
       'CODIGO_DEPARTAMENTO', 'DEPARTAMENTO', 'CODIGO_MUNICIPIO', 'MUNICIPIO',
       'MUNICIPIO_OFERTA', 'NOMBRE_DEL_PROGRAMA', 'NIVEL_ACADEMICO',
       'NIVEL_FORMACION', 'METODOLOGIA', 'ID_AREA', 'ID_NUCLEO',
       'NUCLEO_BÁSICO_DEL_CONOCIMIENTO', 'CODIGO_DEPARTAMENTO_PROGRAMA',
       'DEPARTAMENTO_OFERTA_PROGRAMA', 'CODIGO_MUNICIPIO_PROGRAMA',
       'MUNICIPIO_OFERTA_PROGRAMA', 'ID_GENERO', 'YEAR', 'SEMESTRE',
       'TOTAL_MATRICULADOS'],
      dtype='object')

Para una mejor visualización de los datos, podemos utilizar el método head() para mostrar los primeros 5 registros y el tail() para ver los ultimos 5 registros.

In [ ]:
programas.head()
Out[ ]:
IES_PADRE CODIGO_INSTITUCION NOMBRE_INSTITUCION ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA TITULO_OTORGADO ... MODALIDAD NUMERO_CREDITOS NUMERO_PERIODOS_DE_DURACION PERIODICIDAD SE_OFRECE_POR_CICLOS_PROPEDEUT PERIODICIDAD_ADMISIONES PROGRAMA_EN_CONVENIO DEPARTAMENTO_OFERTA_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA COSTO_MATRICULA_ESTUD_NUEVOS
0 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 52729.0 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... Presencial 135.0 8.0 Semestral No Semestral N Bogotá, D.C. Bogotá, D.C. 10424920.0
1 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 107164 107164.0 DOCTORADO EN ADMINISTRACIÓN DOCTOR(A) EN ADMINISTRACIÓN ... Presencial 135.0 8.0 Semestral No Semestral N Bogotá, D.C. Bogotá, D.C. 8908265.0
2 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 55123 55123.0 DOCTORADO EN AGROECOLOGÍA DOCTOR EN AGROECOLOGÍA ... Presencial 120.0 8.0 Semestral No Anual N Bogotá, D.C. Bogotá, D.C. 9558260.0
3 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 55186 55186.0 DOCTORADO EN ANTROPOLOGIA DOCTOR EN ANTROPOLOGIA ... Presencial 149.0 8.0 Semestral No Semestral N Bogotá, D.C. Bogotá, D.C. 10424920.0
4 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52727 52727.0 DOCTORADO EN ARTE Y ARQUITECTURA DOCTOR EN ARTE Y ARQUITECTURA ... Presencial 140.0 8.0 Semestral No NaN N Bogotá, D.C. Bogotá, D.C. 10424920.0

5 rows × 35 columns

In [ ]:
programas.tail()
Out[ ]:
IES_PADRE CODIGO_INSTITUCION NOMBRE_INSTITUCION ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA TITULO_OTORGADO ... MODALIDAD NUMERO_CREDITOS NUMERO_PERIODOS_DE_DURACION PERIODICIDAD SE_OFRECE_POR_CICLOS_PROPEDEUT PERIODICIDAD_ADMISIONES PROGRAMA_EN_CONVENIO DEPARTAMENTO_OFERTA_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA COSTO_MATRICULA_ESTUD_NUEVOS
6365 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 54252 54252.0 ESPECIALIZACION EN INVESTIGACION CRIMINAL ESPECIALISTA EN INVESTIGACION CRIMINAL ... Presencial NaN 2.0 Semestral No Sin definir N Santander Bucaramanga 10041545.0
6366 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 54805 54805.0 ESPECIALIZACION EN INVESTIGACION CRIMINAL ESPECIALISTA EN INVESTIGACION CRIMINAL ... Presencial 30.0 2.0 Semestral No Semestral N Santander Bucaramanga NaN
6367 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 109316 109316.0 ESPECIALIZACION EN SEGURIDAD Y SALUD EN EL TRA... ESPECIALISTA EN SEGURIDAD Y SALUD EN EL TRABAJO ... Presencial 30.0 2.0 Semestral No Trimestral N Santander Bucaramanga 9129236.0
6368 1735 9122 UNIVERSIDAD MANUELA BELTRAN-UMB- Activa Universidad Privado 106358 106358.0 MAESTRÍA EN SEGURIDAD Y SALUD EN EL TRABAJO MAGÍSTER EN SEGURIDAD Y SALUD EN EL TRABAJO ... Presencial 50.0 4.0 Periodos No Por cohorte N Santander Bucaramanga 11006852.0
6369 1101 9933 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 116706 NaN Especialización en Interculturalidad y Gestión... Especialista en Interculturalidad y Gestión Te... ... Presencial 24.0 2.0 Semestral No Anual N Cesar La Paz NaN

5 rows × 35 columns

In [ ]:
matriculas.head()
Out[ ]:
CODIGO_INSTITUCION IES_PADRE NOMBRE_INSTITUCION PRICIPAL_O_SECCIONAL ID_SECTOR ID_CARACTER CODIGO_DEPARTAMENTO DEPARTAMENTO CODIGO_MUNICIPIO MUNICIPIO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA ID_GENERO YEAR SEMESTRE TOTAL_MATRICULADOS
0 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 2
1 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 20
2 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 6
3 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 4
4 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA PRINCIPAL 1 4 11 BOGOTA D.C. 11001 BOGOTA D.C. ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 3

5 rows × 26 columns

In [ ]:
matriculas.tail()
Out[ ]:
CODIGO_INSTITUCION IES_PADRE NOMBRE_INSTITUCION PRICIPAL_O_SECCIONAL ID_SECTOR ID_CARACTER CODIGO_DEPARTAMENTO DEPARTAMENTO CODIGO_MUNICIPIO MUNICIPIO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA ID_GENERO YEAR SEMESTRE TOTAL_MATRICULADOS
57028 9926 9926 FUNDACION UNIVERSITARIA INTERNACIONAL DE LA RI... Principal 2 3 11 Bogotá D.C. 11001 Bogotá D.C. ... 69 Administración 11 Bogotá D.C. 11001 Bogotá D.C. 2 2020 1 12
57029 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 827 Ingeniería de sistemas telemática y afines 5 Antioquia 5001 Medellín 1 2020 1 4
57030 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 827 Ingeniería de sistemas telemática y afines 5 Antioquia 5001 Medellín 2 2020 1 1
57031 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 69 Administración 5 Antioquia 5001 Medellín 1 2020 1 25
57032 9927 9927 INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... Principal 1 3 5 Antioquia 5001 Medellín ... 69 Administración 5 Antioquia 5001 Medellín 2 2020 1 20

5 rows × 26 columns

2. Combinar los datos en función de la columna 'IES_PADRE'

In [ ]:
datos_combinados = pd.merge(programas, matriculas, on='IES_PADRE', how='inner')

3. Imprimir los datos combinados

In [ ]:
datos_combinados
Out[ ]:
IES_PADRE CODIGO_INSTITUCION_x NOMBRE_INSTITUCION_x ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA_x TITULO_OTORGADO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA_y CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA_y ID_GENERO YEAR_y SEMESTRE TOTAL_MATRICULADOS
0 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 2
1 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 20
2 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 6
3 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 4
4 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 3
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
6849574 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 559 Derecho y afines 13 Bolívar 13001 Cartagena de Indias 2 2020 1 4
6849575 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 69 Administración 13 Bolívar 13001 Cartagena de Indias 1 2020 1 15
6849576 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 69 Administración 13 Bolívar 13001 Cartagena de Indias 2 2020 1 4
6849577 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 833 Otras ingenierías 13 Bolívar 13001 Cartagena de Indias 1 2020 1 7
6849578 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 833 Otras ingenierías 13 Bolívar 13001 Cartagena de Indias 2 2020 1 1

6849579 rows × 60 columns

TERCER PUNTO¶

Para este punto, es necesario emplear bibliotecas de Análisis de Series Temporales.

Se deben generar al menos dos gráficos que utilicen la información de los conjuntos de datos anteriores, utilizando las bibliotecas mencionadas en clase.

Biliotecas

PANDAS¶

Se importa la biblioteca Pandas y se carga los datos. Estos nos permite tener una mejor manipulación de los datos.

In [ ]:
import pandas as pd
posgrados = datos_combinados
In [ ]:
posgrados.columns
Out[ ]:
Index(['IES_PADRE', 'CODIGO_INSTITUCION_x', 'NOMBRE_INSTITUCION_x',
       'ESTADO_INSTITUCION', 'CARACTER_ACADEMICO', 'SECTOR',
       'CODIGO_SNIES_DEL_PROGRAMA', 'CODIGO_ANTERIOR_ICFES',
       'NOMBRE_DEL_PROGRAMA_x', 'TITULO_OTORGADO', 'ESTADO_PROGRAMA',
       'RECONOCIMIENTO_DEL_MINISTERIO', 'RESOLUCION_DE_APROBACION',
       'FECHA_DE_RESOLUCION', 'FECHA_EJECUTORIA', 'VIGENCIA_AÑOS',
       'FECHA_DE_REGISTRO_EN_SNIES', 'YEAR_x', 'CINE_F_2013_AC_CAMPO_AMPLIO',
       'CINE_F_2013_AC_CAMPO_ESPECIFIC', 'CINE_F_2013_AC_CAMPO_DETALLADO',
       'AREA_DE_CONOCIMIENTO', 'NUCLEO_BASICO_DEL_CONOCIMIENTO',
       'NIVEL_ACADEMICO_x', 'NIVEL_DE_FORMACION', 'MODALIDAD',
       'NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'PERIODICIDAD',
       'SE_OFRECE_POR_CICLOS_PROPEDEUT', 'PERIODICIDAD_ADMISIONES',
       'PROGRAMA_EN_CONVENIO', 'DEPARTAMENTO_OFERTA_PROGRAMA_x',
       'MUNICIPIO_OFERTA_PROGRAMA_x', 'COSTO_MATRICULA_ESTUD_NUEVOS',
       'CODIGO_INSTITUCION_y', 'NOMBRE_INSTITUCION_y', 'PRICIPAL_O_SECCIONAL',
       'ID_SECTOR', 'ID_CARACTER', 'CODIGO_DEPARTAMENTO', 'DEPARTAMENTO',
       'CODIGO_MUNICIPIO', 'MUNICIPIO', 'MUNICIPIO_OFERTA',
       'NOMBRE_DEL_PROGRAMA_y', 'NIVEL_ACADEMICO_y', 'NIVEL_FORMACION',
       'METODOLOGIA', 'ID_AREA', 'ID_NUCLEO', 'NUCLEO_BÁSICO_DEL_CONOCIMIENTO',
       'CODIGO_DEPARTAMENTO_PROGRAMA', 'DEPARTAMENTO_OFERTA_PROGRAMA_y',
       'CODIGO_MUNICIPIO_PROGRAMA', 'MUNICIPIO_OFERTA_PROGRAMA_y', 'ID_GENERO',
       'YEAR_y', 'SEMESTRE', 'TOTAL_MATRICULADOS'],
      dtype='object')

2. Verificar la información básica del DataFrame:

In [ ]:
posgrados.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6849579 entries, 0 to 6849578
Data columns (total 60 columns):
 #   Column                          Dtype  
---  ------                          -----  
 0   IES_PADRE                       int64  
 1   CODIGO_INSTITUCION_x            int64  
 2   NOMBRE_INSTITUCION_x            object 
 3   ESTADO_INSTITUCION              object 
 4   CARACTER_ACADEMICO              object 
 5   SECTOR                          object 
 6   CODIGO_SNIES_DEL_PROGRAMA       int64  
 7   CODIGO_ANTERIOR_ICFES           float64
 8   NOMBRE_DEL_PROGRAMA_x           object 
 9   TITULO_OTORGADO                 object 
 10  ESTADO_PROGRAMA                 object 
 11  RECONOCIMIENTO_DEL_MINISTERIO   object 
 12  RESOLUCION_DE_APROBACION        float64
 13  FECHA_DE_RESOLUCION             object 
 14  FECHA_EJECUTORIA                object 
 15  VIGENCIA_AÑOS                   object 
 16  FECHA_DE_REGISTRO_EN_SNIES      object 
 17  YEAR_x                          int64  
 18  CINE_F_2013_AC_CAMPO_AMPLIO     object 
 19  CINE_F_2013_AC_CAMPO_ESPECIFIC  object 
 20  CINE_F_2013_AC_CAMPO_DETALLADO  object 
 21  AREA_DE_CONOCIMIENTO            object 
 22  NUCLEO_BASICO_DEL_CONOCIMIENTO  object 
 23  NIVEL_ACADEMICO_x               object 
 24  NIVEL_DE_FORMACION              object 
 25  MODALIDAD                       object 
 26  NUMERO_CREDITOS                 float64
 27  NUMERO_PERIODOS_DE_DURACION     float64
 28  PERIODICIDAD                    object 
 29  SE_OFRECE_POR_CICLOS_PROPEDEUT  object 
 30  PERIODICIDAD_ADMISIONES         object 
 31  PROGRAMA_EN_CONVENIO            object 
 32  DEPARTAMENTO_OFERTA_PROGRAMA_x  object 
 33  MUNICIPIO_OFERTA_PROGRAMA_x     object 
 34  COSTO_MATRICULA_ESTUD_NUEVOS    float64
 35  CODIGO_INSTITUCION_y            int64  
 36  NOMBRE_INSTITUCION_y            object 
 37  PRICIPAL_O_SECCIONAL            object 
 38  ID_SECTOR                       int64  
 39  ID_CARACTER                     int64  
 40  CODIGO_DEPARTAMENTO             int64  
 41  DEPARTAMENTO                    object 
 42  CODIGO_MUNICIPIO                int64  
 43  MUNICIPIO                       object 
 44  MUNICIPIO_OFERTA                int64  
 45  NOMBRE_DEL_PROGRAMA_y           object 
 46  NIVEL_ACADEMICO_y               object 
 47  NIVEL_FORMACION                 object 
 48  METODOLOGIA                     object 
 49  ID_AREA                         int64  
 50  ID_NUCLEO                       object 
 51  NUCLEO_BÁSICO_DEL_CONOCIMIENTO  object 
 52  CODIGO_DEPARTAMENTO_PROGRAMA    int64  
 53  DEPARTAMENTO_OFERTA_PROGRAMA_y  object 
 54  CODIGO_MUNICIPIO_PROGRAMA       int64  
 55  MUNICIPIO_OFERTA_PROGRAMA_y     object 
 56  ID_GENERO                       int64  
 57  YEAR_y                          int64  
 58  SEMESTRE                        int64  
 59  TOTAL_MATRICULADOS              object 
dtypes: float64(5), int64(16), object(39)
memory usage: 3.1+ GB

3. Se puede filtrar datos exactos.

In [ ]:
# Filtrar programas que están en un estado específico
programas_activos = posgrados[posgrados['ESTADO_PROGRAMA'] == 'Activo']
programas_activos
Out[ ]:
IES_PADRE CODIGO_INSTITUCION_x NOMBRE_INSTITUCION_x ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA_x TITULO_OTORGADO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA_y CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA_y ID_GENERO YEAR_y SEMESTRE TOTAL_MATRICULADOS
0 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 2
1 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 20
2 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 6
3 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 4
4 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 5.272900e+04 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 3
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
6849574 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 559 Derecho y afines 13 Bolívar 13001 Cartagena de Indias 2 2020 1 4
6849575 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 69 Administración 13 Bolívar 13001 Cartagena de Indias 1 2020 1 15
6849576 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 69 Administración 13 Bolívar 13001 Cartagena de Indias 2 2020 1 4
6849577 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 833 Otras ingenierías 13 Bolívar 13001 Cartagena de Indias 1 2020 1 7
6849578 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 833 Otras ingenierías 13 Bolívar 13001 Cartagena de Indias 2 2020 1 1

6849579 rows × 60 columns

4. Se puede agrupar y agregar datos

In [ ]:
# Contar la cantidad de programas por año
conteo_por_año = posgrados.groupby('YEAR_y').size()
conteo_por_año
Out[ ]:
YEAR_y
2015    1002070
2016    1096330
2017    1144787
2018    1172944
2019    1220241
2020    1213207
dtype: int64
In [ ]:
# Se agrupa el DataFrame por la columna 'METODOLOGIA' y se cuentan los registros en cada grupo
agrupacion_modalidad = posgrados.groupby('METODOLOGIA')
agrupacion_modalidad.count()
Out[ ]:
IES_PADRE CODIGO_INSTITUCION_x NOMBRE_INSTITUCION_x ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA_x TITULO_OTORGADO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA_y CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA_y ID_GENERO YEAR_y SEMESTRE TOTAL_MATRICULADOS
METODOLOGIA
Dual 116378 116378 116378 116378 116378 116378 116378 92712 116378 116378 ... 116378 116378 116378 116378 116378 116378 116378 116378 116378 116378
Presencial 6445057 6445057 6445057 6445057 6445057 6445057 6445057 6090049 6445057 6445057 ... 6445057 6445057 6445057 6445057 6445057 6445057 6445057 6445057 6445057 6445057
Virtual 288144 288144 288144 288144 288144 288144 288144 230431 288144 288144 ... 288144 288144 288144 288144 288144 288144 288144 288144 288144 288144

3 rows × 59 columns

MATPLOLIB y SEABORN¶

Estas bibliotecas nos permiten realizar gráficos de acuerdo a los datos proporcionados.

Ejemplo 1

Este código es útil para realizar un análisis inicial de los datos agrupados por año y modalidad, así como para calcular un total de registros por año.

Se importan las bibliotecas.

In [ ]:
import pandas as pd
import matplotlib.pyplot as plt

Se agrupan y se realiza un conteo de registros por año y modalidad.

In [ ]:
registros_por_modalidad_y_year = posgrados.groupby(['YEAR_x', 'MODALIDAD']).size().unstack()

Se agrega una columna 'Total' que contiene la suma de registros por cada año.

In [ ]:
registros_por_modalidad_y_year['Total'] = registros_por_modalidad_y_year.sum(axis=1)

Finalmente, se imprime el dataframe resultante.

In [ ]:
registros_por_modalidad_y_year
Out[ ]:
MODALIDAD Dual Presencial Virtual Total
YEAR_x
1998 2570.0 941010.0 8303.0 951883.0
1999 NaN 77841.0 5552.0 83393.0
2000 NaN 77847.0 9487.0 87334.0
2001 NaN 79826.0 2347.0 82173.0
2002 NaN 184157.0 335.0 184492.0
2003 NaN 210995.0 1627.0 212622.0
2004 NaN 36412.0 506.0 36918.0
2005 NaN 112180.0 226.0 112406.0
2006 NaN 67713.0 6615.0 74328.0
2007 NaN 248117.0 10150.0 258267.0
2008 1005.0 129322.0 1169.0 131496.0
2009 NaN 112856.0 8727.0 121583.0
2010 NaN 223506.0 6963.0 230469.0
2011 NaN 98962.0 1036.0 99998.0
2012 NaN 159776.0 5854.0 165630.0
2013 1005.0 153483.0 20296.0 174784.0
2014 3528.0 194055.0 12338.0 209921.0
2015 2290.0 226834.0 22025.0 251149.0
2016 638.0 149840.0 11019.0 161497.0
2017 3076.0 209363.0 10569.0 223008.0
2018 NaN 362933.0 20639.0 383572.0
2019 5728.0 546420.0 46858.0 599006.0
2020 1511.0 295859.0 59743.0 357113.0
2021 4792.0 411268.0 69515.0 485575.0
2022 4901.0 210320.0 49919.0 265140.0
2023 38255.0 490373.0 152782.0 681410.0
2024 18681.0 131628.0 74103.0 224412.0

Para grafícar los resultados de la tabla, se debe realizar los siguientes pasos:

1. Se importan las bibliotecas.

2. Se agrupan y se realiza un conteo de registros por año y modalidad.

3. Se realiza una iteración sobre cada modalidad para graficar la evolución de la cantidad de registros para cada modalidad. Luego, se configura:

  • El título y etiquetas de los ejes
  • Los ticks en el eje x (años) para mostrar solo cada dos años
  • La leyenda con título y posición

Por ultimo, se hace la activación de la cuadrícula en el gráfico, para mejor análisis.

In [ ]:
import pandas as pd
import matplotlib.pyplot as plt

registros_por_modalidad_y_anio = posgrados.groupby(['YEAR_x', 'MODALIDAD']).size().unstack()

plt.figure(figsize=(12, 6))
for modalidad in registros_por_modalidad_y_anio.columns:
    plt.plot(registros_por_modalidad_y_anio.index, registros_por_modalidad_y_anio[modalidad], marker='o', label=modalidad)

plt.title('Evolución de la Cantidad de Registros por Modalidad')
plt.xlabel('Año')
plt.ylabel('Cantidad de Registros')
plt.xticks(registros_por_modalidad_y_anio.index[::2])
plt.legend(title='Modalidad', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid(True)
plt.ylim(bottom=0.5)
plt.tight_layout()
plt.show()

Conclusión:

El gráfico de líneas titulado "Evolución de la Cantidad de Registros por Modalidad" muestra un cambio significativo en el número de registros en diversas modalidades educativas desde 1998 hasta 2024. En 1998, se contabilizaban aproximadamente 900,000 registros presenciales, 8,000 registros virtuales y 2,000 registros en modalidad dual. Para el año 2024, los registros presenciales han disminuido notablemente a alrededor de 130,000, mientras que las modalidades virtual y dual han experimentado un incremento significativo, con aproximadamente 74,000 y 18,000 registros respectivamente, en comparación con los datos de 1998. Este cambio puede atribuirse en parte a la pandemia de COVID-19 en 2020, que redujo los registros presenciales y fomentó la adopción de modalidades virtuales y duales por parte de las instituciones educativas. Además, este aumento podría estar relacionado con la creciente utilización de tecnologías de la información y comunicación (TIC) para mejorar la accesibilidad y flexibilidad de la educación.

Ejemplo 2

Este código muestra cada departamento con la cantidad de programas únicos que ofrece, facilitando así la comprensión de la distribución de programas entre diferentes departamentos.

Se realiza la agrupación y conteo de programas únicos por departamento.

In [ ]:
programas_por_departamento = posgrados.groupby('DEPARTAMENTO_OFERTA_PROGRAMA_x')['NOMBRE_DEL_PROGRAMA_x'].nunique().reset_index()

Se renombran las columnas del DataFrame resultante.

In [ ]:
programas_por_departamento.columns = ['Departamento', 'Cantidad de programas']

Por último, se imprime el DataFrame resultante.

In [ ]:
programas_por_departamento
Out[ ]:
Departamento Cantidad de programas
0 Amazonas 4
1 Antioquia 800
2 Arauca 3
3 Archipiélago de San Andrés, Providencia y Sant... 5
4 Atlántico 375
5 Bogotá, D.C. 1680
6 Bolívar 217
7 Boyacá 172
8 Caldas 231
9 Caquetá 17
10 Casanare 14
11 Cauca 114
12 Cesar 41
13 Chocó 13
14 Cundinamarca 129
15 Córdoba 92
16 Huila 75
17 La Guajira 23
18 Magdalena 91
19 Meta 65
20 Nariño 121
21 Norte de Santander 122
22 Putumayo 3
23 Quindío 62
24 Risaralda 136
25 Santander 340
26 Sucre 11
27 Tolima 95
28 Valle del Cauca 499
29 Vaupés 1

Para grafícar los resultados de la tabla, se debe realizar los siguientes pasos:

1. Se importan las bibliotecas.

2. Se ordena el DataFrame por la cantidad de programas de forma descendente y se configura el estilo de seaborn.

3. Se crea una figura para el gráfico con tamaño específico y se genera el gráfico de barras utilizando seaborn. Luego, se configuran:

  • El título y etiquetas de los ejes.
  • Las etiquetas del eje x con rotación.
  • Alineación y tamaño de fuente adecuados.

Finalmente, se ajusta el diseño del gráfico para mejorar la distribución y se muestra en pantalla.

In [ ]:
import matplotlib.pyplot as plt
import seaborn as sns

programas_por_departamento = programas_por_departamento.sort_values(by='Cantidad de programas', ascending=False)

sns.set(style="whitegrid")
plt.figure(figsize=(12, 8))
bars = sns.barplot(x='Departamento', y='Cantidad de programas', data=programas_por_departamento, palette=sns.color_palette("husl", len(programas_por_departamento)))

plt.title('Cantidad de Programas de Posgrado por Departamento')
plt.xlabel('Departamento')
plt.ylabel('Cantidad de Programas')
bars.set_xticklabels(bars.get_xticklabels(), rotation=45, ha='right', fontsize=10)
plt.tight_layout()
plt.show()
<ipython-input-29-21844777684b>:8: FutureWarning: 

Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.

  bars = sns.barplot(x='Departamento', y='Cantidad de programas', data=programas_por_departamento, palette=sns.color_palette("husl", len(programas_por_departamento)))
<ipython-input-29-21844777684b>:13: UserWarning: FixedFormatter should only be used together with FixedLocator
  bars.set_xticklabels(bars.get_xticklabels(), rotation=45, ha='right', fontsize=10)

Conclusión:

El gráfico "Cantidad de Programas de Posgrado por Departamento" revela una variabilidad significativa en la oferta de programas posgraduales entre los departamentos colombianos. Por ejemplo, Bogotá D.C. cuenta con más de 1,600 programas, mientras que Vaupés tiene solo 1, siendo el menor número de todos. Esta disparidad puede explicarse por el tamaño del departamento, sus recursos financieros y académicos, así como las demandas del mercado laboral local. Este análisis es crucial para que los estudiantes puedan seleccionar el departamento más adecuado según sus intereses académicos, subrayando la importancia de políticas educativas que fomenten una distribución equitativa de programas posgraduales en todo el país.

ENTREGA ACTIVIDAD 2¶

Daniela Stephania Lombana Garcia

Estadistica inferencial¶

Para iniciar, se instala la biblioteca Scipy que ofrece herramientas y algoritmos matemáticos.

In [ ]:
pip install scipy
Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (1.13.1)
Requirement already satisfied: numpy<2.3,>=1.22.4 in /usr/local/lib/python3.10/dist-packages (from scipy) (1.26.4)

Se importa la biblioteca que incluye el paquete Stats para estadísticas.

In [ ]:
import scipy.stats as stats

Se importan los datos de muestra generados en la actividad anterior, denominados datos combinados y extraer la columna de interés.

El dropna es para eliminar valores NaN si los hay.

In [ ]:
datos_muestra = datos_combinados['NUMERO_CREDITOS'].dropna()

Se formulan las hipótesis nula y alternativa.

  • Hipótesis nula: la media de 'NUMERO_CREDITOS' es igual a 60.5
  • Hipótesis alternativa: la media de los 'NUMERO_CREDITOS' no es igual a 60.5

Realicemos una prueba t de la muestra.

  • Los parametros estadistico t y valor p, mide la diferencia de los datos de la muestra y la media hipotetica en unidades de desviación estandar de la muestra.
In [ ]:
estadistico_t, valor_p = stats.ttest_1samp(datos_muestra, 60.5)
print(f"Estadístico t: {estadistico_t}")
print(f"Valor p: {valor_p}")
Estadístico t: 1.5216414043130821
Valor p: 0.1280990037842468

Conclusión: Dado que el valor p (0.128) es mayor que 0.05, no se cuenta con suficiente evidencia para rechazar la hipótesis nula. Por lo tanto, no se puede concluir que la media de los datos de la muestra sea significativamente diferente de 60.5.

Por otro lado, se puede determinar el intervalo de confianza del 95% para la media del número de créditos en los datos y a visualizar la distribución de estos créditos.

Se importa la biblioteca numpy y matplotlib para realizar cálculos numéricos y crear visualizaciones gráficas.

In [ ]:
import numpy as np
import matplotlib.pyplot as plt

Se calcula la media y el intervalo de confianza.

In [ ]:
def calcular_intervalo_confianza(datos, confianza=0.95):
    media = np.mean(datos)
    sem = stats.sem(datos)
    intervalo = stats.t.interval(confianza, len(datos) - 1, loc=media, scale=sem)
    return media, intervalo
In [ ]:
media_creditos, intervalo_confianza = calcular_intervalo_confianza(datos_muestra)

Se visualiza los resultados.

In [ ]:
print(f"Media del número de créditos: {media_creditos:.2f}")
print(f'Intervalo de confianza (95%) para la media de créditos: {intervalo_confianza}')
Media del número de créditos: 60.53
Intervalo de confianza (95%) para la media de créditos: (60.49094551718293, 60.57191989542532)

Por último, se genera un histograma para visualizar la distribución del número de créditos.

In [ ]:
plt.figure(figsize=(10, 6))
plt.hist(datos_muestra, bins=range(int(min(datos_muestra)), int(max(datos_muestra)) + 2), edgecolor='black')
plt.axvline(media_creditos, color='red', linestyle='dashed', linewidth=1, label=f'Promedio: {media_creditos:.2f}')
plt.axvline(intervalo_confianza[0], color='green', linestyle='dashed', linewidth=1, label='Límite Inferior del IC')
plt.axvline(intervalo_confianza[1], color='green', linestyle='dashed', linewidth=1, label='Límite Superior del IC')

plt.xlabel('Número de Créditos')
plt.ylabel('Frecuencia')
plt.title('Distribución del Número de Créditos')
plt.legend()
plt.show()
In [ ]:
confidence = 0.95
print(f"Con un nivel de confianza del {confidence*100}%, se estima que el número de créditos promedio en la población estudiantil es de {intervalo_confianza[0]:.1f} a {intervalo_confianza[1]:.1f}.")
Con un nivel de confianza del 95.0%, se estima que el número de créditos promedio en la población estudiantil es de 60.5 a 60.6.

ANOVA¶

El análisis de varianza (ANOVA) es una técnica estadística que se utiliza para verificar si las medias de dos o más grupos son significativamente diferentes entre sí. ANOVA verifica el impacto de uno o más factores al comparar las medias de diferentes muestras.

Se importa la biblioteca que incluye el paquete Stats para estadísticas.

In [ ]:
import scipy.stats as stats

Se filtrar los valores NaN en las columnas de NUMERO_CREDITOS y MODALIDAD. Luego, se agruparon los datos por modalidad y se convirtieron las series resultantes en listas.

In [ ]:
datos_num= datos_combinados[['NUMERO_CREDITOS', 'MODALIDAD']].dropna()
grupos = datos_num.groupby('MODALIDAD')['NUMERO_CREDITOS'].apply(list)
In [ ]:
grupos
Out[ ]:
MODALIDAD
Dual          [40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40....
Presencial    [135.0, 135.0, 135.0, 135.0, 135.0, 135.0, 135...
Virtual       [28.0, 28.0, 28.0, 28.0, 28.0, 28.0, 28.0, 28....
Name: NUMERO_CREDITOS, dtype: object
In [ ]:
Presencial = grupos.get('Presencial', [])
Virtual = grupos.get('Virtual', [])
Dual = grupos.get('Dual', [])

Se formulan las hipótesis nula y alternativa.

  • Hipótesis nula: las medias de todos los grupos son iguales.

  • Hipótesis alternativa: al menos una media de grupo es diferente de las demás.

Realicemos una prueba ANOVA de una vía.

In [ ]:
estadistico_f, valor_p = stats.f_oneway(Presencial, Virtual, Dual)
print(f"Estadístico F: {estadistico_f}")
print(f"Valor p: {valor_p}")
Estadístico F: 87481.3450827921
Valor p: 0.0

Conclusion: Dado que el valor p es inferior al nivel de significancia de 0.05, rechazamos la hipótesis nula. Esto indica que hay diferencias estadísticamente significativas en las medias de número de creditos entre al menos dos de las modalidades (Presencial, Virtual y Dual). Por lo tanto, podemos concluir que el número de créditos varía significativamente entre estas modalidades.

Regresión lineal¶

En este ejercicio, se llevará a cabo un análisis de regresión lineal para investigar la relación entre el número de créditos de un programa académico y el costo de matrícula para estudiantes nuevos. El objetivo es determinar cómo varía el costo de matrícula en función del número de créditos del programa, utilizando datos proporcionados en el conjunto de datos datos_combinados.

Se importan las librerías necesarias para el análisis:

  • Pandas: para manipulación y análisis de datos.

  • NumPy: para cálculos numéricos y operaciones matemáticas.

  • Matplotlib: para la creación de gráficos y visualizaciones.

In [ ]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Se eliminan los valores NaN en las columnas NUMERO_CREDITOS y COSTO_MATRICULA_ESTUD_NUEVOS.

In [ ]:
datos_filtrados = datos_combinados[['NUMERO_CREDITOS', 'COSTO_MATRICULA_ESTUD_NUEVOS']].dropna()

Se obtiene los datos de las columnas.

In [ ]:
X = datos_filtrados['NUMERO_CREDITOS'].values
y = datos_filtrados['COSTO_MATRICULA_ESTUD_NUEVOS'].values

Descripción de variables:

  • X: Lista que contiene el número de créditos de los programas académicos. Esta variable se utiliza como predictor o variable independiente en el análisis.

  • Y: Lista que representa el costo de matrícula para estudiantes nuevos. Esta variable es la respuesta o variable dependiente que se intenta predecir en función del número de créditos.

Añadir el término de intercepción a X

In [ ]:
X_ones = np.c_[np.ones(len(X)), X]

Se calcula los parámetros del modelo (regresión lineal).

In [ ]:
beta = np.linalg.inv(X_ones.T.dot(X_ones)).dot(X_ones.T).dot(y)
print(f'Parámetros del modelo (beta): {beta}')
Parámetros del modelo (beta): [9883921.78944088   43562.81870339]

Se grafíca los datos y la línea de regresión.

In [ ]:
plt.figure(figsize=(10, 6))
plt.scatter(X, y, s=40, c='#FF0000', label='Datos')
X_lim = [X.min(), X.max()]
X_lim_ones = np.c_[np.ones(2), X_lim]
y_lim = X_lim_ones.dot(beta)
plt.plot(X_lim, y_lim, 'g-', label='Línea de Regresión')

# Configurar el gráfico
plt.xlabel('Número de Créditos')
plt.ylabel('Costo de Matrícula Estudiantes Nuevos')
plt.title('Número de Créditos vs Costo de Matrícula Estudiantes Nuevos')
plt.legend()
plt.grid()
plt.show()

Conclusión: El gráfico muestra que no parece haber una relación clara entre el número de créditos y el costo de matrícula de los estudiantes nuevos. Los puntos están muy dispersos y no siguen un patrón específico. La línea de tendencia es casi plana, lo que sugiere que el número de créditos no afecta mucho el costo de matrícula. En general, parece que el costo de matrícula no depende mucho del número de créditos que toman los estudiantes.

Se predice el costo de matrícula para un número dado de créditos.

In [ ]:
numero_creditos_nuevo = 40
costo_matricula_pred = beta[0] + (beta[1] * numero_creditos_nuevo)
# Usando f-string con formato para miles
print(f'El costo de matrícula calculado para {numero_creditos_nuevo} créditos es: ${costo_matricula_pred:,.2f}')
El costo de matrícula calculado para 40 créditos es: $11,626,434.54

Análisis multivariante¶

El objetivo de este análisis es aplicar PCA a datos de programas educativos, caracterizados por variables como el número de créditos, duración, costo, matriculados y vigencia. Usaremos PCA para reducir la dimensionalidad y visualizar cómo estas variables se relacionan y se agrupan en un espacio de dos dimensiones. Para ello podemos seguir los siguientes pasos:

PASO 1. Se impota las librerías.

In [ ]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

PASO 2. Preparar los datos

Se selecciona las variables numéricas para el análisis.

In [ ]:
variables = ['NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'COSTO_MATRICULA_ESTUD_NUEVOS', 'TOTAL_MATRICULADOS', 'VIGENCIA_AÑOS']

Se extrae las columnas seleccionadas.

In [ ]:
datos_seleccionados = datos_combinados[variables]

Se verifica los tipos de datos.

In [ ]:
print(datos_seleccionados.dtypes)
NUMERO_CREDITOS                 float64
NUMERO_PERIODOS_DE_DURACION     float64
COSTO_MATRICULA_ESTUD_NUEVOS    float64
TOTAL_MATRICULADOS               object
VIGENCIA_AÑOS                    object
dtype: object

PASO 3. Convertir datos a numérico y limpiar.

Se convierten las columnas a tipo numérico, manejando los errores y los datos en formato texto.

In [ ]:
for column in datos_seleccionados.columns:
    if datos_seleccionados[column].dtype == 'object':
        datos_seleccionados[column] = datos_seleccionados[column].str.replace(',', '.', regex=False)
        datos_seleccionados[column] = pd.to_numeric(datos_seleccionados[column], errors='coerce')
<ipython-input-56-29eec8ba173a>:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  datos_seleccionados[column] = datos_seleccionados[column].str.replace(',', '.', regex=False)
<ipython-input-56-29eec8ba173a>:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  datos_seleccionados[column] = pd.to_numeric(datos_seleccionados[column], errors='coerce')

Se elimina las filas con valores nulos.

In [ ]:
datos_seleccionados = datos_seleccionados.dropna()
In [ ]:
datos_seleccionados.dtypes
Out[ ]:
NUMERO_CREDITOS                 float64
NUMERO_PERIODOS_DE_DURACION     float64
COSTO_MATRICULA_ESTUD_NUEVOS    float64
TOTAL_MATRICULADOS              float64
VIGENCIA_AÑOS                   float64
dtype: object
In [ ]:
datos_seleccionados.head()
Out[ ]:
NUMERO_CREDITOS NUMERO_PERIODOS_DE_DURACION COSTO_MATRICULA_ESTUD_NUEVOS TOTAL_MATRICULADOS VIGENCIA_AÑOS
0 135.0 8.0 10424920.0 2.0 8.0
1 135.0 8.0 10424920.0 20.0 8.0
2 135.0 8.0 10424920.0 6.0 8.0
3 135.0 8.0 10424920.0 4.0 8.0
4 135.0 8.0 10424920.0 3.0 8.0

PASO 4. Normalizar los datos

Se normaliza los datos.

In [ ]:
scaler = StandardScaler()
datos_scaled = scaler.fit_transform(datos_seleccionados)

PASO 5. Aplicar PCA

In [ ]:
pca = PCA(n_components=2)
pca_resultados = pca.fit_transform(datos_scaled)

PASO 6. Crear un DataFrame para los resultados de PCA.

In [ ]:
df_pca = pd.DataFrame(data=pca_resultados, columns=['Componente Principal 1', 'Componente Principal 2'])

Paso 7. Visualizar los resultados del PCA.

In [ ]:
plt.figure(figsize=(10, 6))
sns.scatterplot(x='Componente Principal 1', y='Componente Principal 2', data=df_pca, alpha=0.5)
plt.title('Resultados de PCA - Análisis Multivariante de Programas')
plt.xlabel('Componente Principal 1')
plt.ylabel('Componente Principal 2')
plt.grid(True)
plt.show()

Conclusiones:

El gráfico de PCA muestra cómo los programas educativos se distribuyen en función de dos componentes principales. La mayoría de los puntos se agrupan en una región central, lo que indica que muchos programas tienen características similares en términos de créditos, duración, costo, matriculados y vigencia. Sin embargo, también se observan algunos puntos dispersos fuera del grupo principal, lo que sugiere que hay programas con características únicas o diferentes. Estos puntos dispersos pueden indicar variabilidad en las características de ciertos programas educativos que no son comunes en la mayoría de los casos.

Correlación¶

Se importan las librerías.

In [ ]:
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

Para una mejor visualización de los datos, podemos utilizar el método head() para mostrar los primeros 5 registros y el tail() para ver los ultimos 5 registros.

In [ ]:
datos_combinados.head()
Out[ ]:
IES_PADRE CODIGO_INSTITUCION_x NOMBRE_INSTITUCION_x ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA_x TITULO_OTORGADO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA_y CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA_y ID_GENERO YEAR_y SEMESTRE TOTAL_MATRICULADOS
0 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 52729.0 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 2
1 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 52729.0 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 20
2 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 52729.0 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 6
3 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 52729.0 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 1 2015 1 4
4 1101 1101 UNIVERSIDAD NACIONAL DE COLOMBIA Activa Universidad Oficial 52729 52729.0 DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... DOCTOR EN INGENIERIA ... 445 MEDICINA 11 BOGOTA D.C. 11001 BOGOTA D.C. 2 2015 1 3

5 rows × 60 columns

Warning: Total number of columns (60) exceeds max_columns (20) limiting to first (20) columns.
In [ ]:
datos_combinados.tail()
Out[ ]:
IES_PADRE CODIGO_INSTITUCION_x NOMBRE_INSTITUCION_x ESTADO_INSTITUCION CARACTER_ACADEMICO SECTOR CODIGO_SNIES_DEL_PROGRAMA CODIGO_ANTERIOR_ICFES NOMBRE_DEL_PROGRAMA_x TITULO_OTORGADO ... ID_NUCLEO NUCLEO_BÁSICO_DEL_CONOCIMIENTO CODIGO_DEPARTAMENTO_PROGRAMA DEPARTAMENTO_OFERTA_PROGRAMA_y CODIGO_MUNICIPIO_PROGRAMA MUNICIPIO_OFERTA_PROGRAMA_y ID_GENERO YEAR_y SEMESTRE TOTAL_MATRICULADOS
6849574 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 559 Derecho y afines 13 Bolívar 13001 Cartagena de Indias 2 2020 1 4
6849575 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 69 Administración 13 Bolívar 13001 Cartagena de Indias 1 2020 1 15
6849576 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 69 Administración 13 Bolívar 13001 Cartagena de Indias 2 2020 1 4
6849577 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 833 Otras ingenierías 13 Bolívar 13001 Cartagena de Indias 1 2020 1 7
6849578 9105 9105 ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA Activa Universidad Oficial 21547 9.105655e+20 MAESTRIA EN OCEANOGRAFÍA MAGISTER EN OCEANOGRAFÍA ... 833 Otras ingenierías 13 Bolívar 13001 Cartagena de Indias 2 2020 1 1

5 rows × 60 columns

Warning: Total number of columns (60) exceeds max_columns (20) limiting to first (20) columns.
In [ ]:
datos_combinados.columns
Out[ ]:
Index(['IES_PADRE', 'CODIGO_INSTITUCION_x', 'NOMBRE_INSTITUCION_x',
       'ESTADO_INSTITUCION', 'CARACTER_ACADEMICO', 'SECTOR',
       'CODIGO_SNIES_DEL_PROGRAMA', 'CODIGO_ANTERIOR_ICFES',
       'NOMBRE_DEL_PROGRAMA_x', 'TITULO_OTORGADO', 'ESTADO_PROGRAMA',
       'RECONOCIMIENTO_DEL_MINISTERIO', 'RESOLUCION_DE_APROBACION',
       'FECHA_DE_RESOLUCION', 'FECHA_EJECUTORIA', 'VIGENCIA_AÑOS',
       'FECHA_DE_REGISTRO_EN_SNIES', 'YEAR_x', 'CINE_F_2013_AC_CAMPO_AMPLIO',
       'CINE_F_2013_AC_CAMPO_ESPECIFIC', 'CINE_F_2013_AC_CAMPO_DETALLADO',
       'AREA_DE_CONOCIMIENTO', 'NUCLEO_BASICO_DEL_CONOCIMIENTO',
       'NIVEL_ACADEMICO_x', 'NIVEL_DE_FORMACION', 'MODALIDAD',
       'NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'PERIODICIDAD',
       'SE_OFRECE_POR_CICLOS_PROPEDEUT', 'PERIODICIDAD_ADMISIONES',
       'PROGRAMA_EN_CONVENIO', 'DEPARTAMENTO_OFERTA_PROGRAMA_x',
       'MUNICIPIO_OFERTA_PROGRAMA_x', 'COSTO_MATRICULA_ESTUD_NUEVOS',
       'CODIGO_INSTITUCION_y', 'NOMBRE_INSTITUCION_y', 'PRICIPAL_O_SECCIONAL',
       'ID_SECTOR', 'ID_CARACTER', 'CODIGO_DEPARTAMENTO', 'DEPARTAMENTO',
       'CODIGO_MUNICIPIO', 'MUNICIPIO', 'MUNICIPIO_OFERTA',
       'NOMBRE_DEL_PROGRAMA_y', 'NIVEL_ACADEMICO_y', 'NIVEL_FORMACION',
       'METODOLOGIA', 'ID_AREA', 'ID_NUCLEO', 'NUCLEO_BÁSICO_DEL_CONOCIMIENTO',
       'CODIGO_DEPARTAMENTO_PROGRAMA', 'DEPARTAMENTO_OFERTA_PROGRAMA_y',
       'CODIGO_MUNICIPIO_PROGRAMA', 'MUNICIPIO_OFERTA_PROGRAMA_y', 'ID_GENERO',
       'YEAR_y', 'SEMESTRE', 'TOTAL_MATRICULADOS'],
      dtype='object')

Se define las columnas con las que desea trabajar para el análisis de correlación.

In [ ]:
columnas_requeridas = ['NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'COSTO_MATRICULA_ESTUD_NUEVOS', 'TOTAL_MATRICULADOS']
In [ ]:
nuevo_data = datos_combinados[columnas_requeridas].replace({'0': np.nan, '': np.nan})
nuevo_data.head()
Out[ ]:
NUMERO_CREDITOS NUMERO_PERIODOS_DE_DURACION COSTO_MATRICULA_ESTUD_NUEVOS TOTAL_MATRICULADOS
0 135.0 8.0 10424920.0 2
1 135.0 8.0 10424920.0 20
2 135.0 8.0 10424920.0 6
3 135.0 8.0 10424920.0 4
4 135.0 8.0 10424920.0 3

Se realiza las transformaciones necesarias como conversión de tipos y manejo de valores nulos.

In [ ]:
nuevo_data['NUMERO_CREDITOS'] = pd.to_numeric(nuevo_data['NUMERO_CREDITOS'], errors='coerce')
nuevo_data['NUMERO_PERIODOS_DE_DURACION'] = pd.to_numeric(nuevo_data['NUMERO_PERIODOS_DE_DURACION'], errors='coerce')
nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'] = pd.to_numeric(nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'], errors='coerce')
nuevo_data['TOTAL_MATRICULADOS'] = pd.to_numeric(nuevo_data['TOTAL_MATRICULADOS'], errors='coerce')
In [ ]:
nuevo_data = nuevo_data.dropna(subset = columnas_requeridas)
In [ ]:
nuevo_data
Out[ ]:
NUMERO_CREDITOS NUMERO_PERIODOS_DE_DURACION COSTO_MATRICULA_ESTUD_NUEVOS TOTAL_MATRICULADOS
0 135.0 8.0 10424920.0 2.0
1 135.0 8.0 10424920.0 20.0
2 135.0 8.0 10424920.0 6.0
3 135.0 8.0 10424920.0 4.0
4 135.0 8.0 10424920.0 3.0
... ... ... ... ...
6849574 57.0 4.0 9280000.0 4.0
6849575 57.0 4.0 9280000.0 15.0
6849576 57.0 4.0 9280000.0 4.0
6849577 57.0 4.0 9280000.0 7.0
6849578 57.0 4.0 9280000.0 1.0

5552001 rows × 4 columns

Utilizamos el dtypes para verificar rápidamente qué tipo de datos tiene cada columna.

In [ ]:
nuevo_data.dtypes
Out[ ]:
NUMERO_CREDITOS                 float64
NUMERO_PERIODOS_DE_DURACION     float64
COSTO_MATRICULA_ESTUD_NUEVOS    float64
TOTAL_MATRICULADOS              float64
dtype: object

Tambien se puede utilizar el count para contar el número de valores no nulos en cada columna del DataFrame.

In [ ]:
nuevo_data.count()
Out[ ]:
NUMERO_CREDITOS                 5552001
NUMERO_PERIODOS_DE_DURACION     5552001
COSTO_MATRICULA_ESTUD_NUEVOS    5552001
TOTAL_MATRICULADOS              5552001
dtype: int64

Se puede calcular la correlación entre dos columnas específicas del DataFrame.

In [ ]:
correlation = nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'].corr(nuevo_data['NUMERO_CREDITOS'])
print(f'Correlación entre Costo de estudiantes matriculados y Número de créditos: {correlation}')
Correlación entre Costo de estudiantes matriculados y Número de créditos: 0.32364517667598025

Conclusión: La correlación entre el costo de estudiantes matriculados y el número de créditos es de aproximadamente 0.32. Esto sugiere una correlación positiva débil. En otras palabras, hay una relación ligera entre el costo de los estudiantes matriculados y el número de créditos; a medida que uno aumenta, el otro tiende a aumentar también, pero la relación no es muy fuerte.

Se utiliza Scatter plot para visualizar la relación entre dos variables.

In [ ]:
plt.scatter(nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'], nuevo_data['NUMERO_CREDITOS'], color = 'red')
plt.title('Relación entre Costo de estudiantes matriculados y Número de créditos', fontweight='bold')
plt.xlabel('Costo de estudiantes matriculados', fontweight='bold')
plt.ylabel('Número de créditos', fontweight='bold')
plt.show()

Conclusión: El gráfico muestra que no hay una relación clara entre el costo de matrícula y el número de créditos cursados por los estudiantes. La dispersión de los datos y la falta de una tendencia lineal indican que el costo de matrícula no tiene un impacto directo en el número de créditos que los estudiantes eligen tomar. Sin embargo, es posible que, en casos donde los estudiantes inscriban créditos adicionales, el aumento en el número de créditos del programa pueda estar asociado con un incremento en el costo de matrícula.

ENTREGA ACTIVIDAD 3¶

Daniela Stephania Lombana Garcia

En está entrega se utilizó Python, para desarrollar un web scraper con el objetivo de extraer información sobre graduados en Colombia, tanto de pregrados como de posgrados, desde fuentes web específicas.

Para gestionar estos datos, se configuró inicialmente un entorno local con XAMPP y luego los migró a la nube a través de Clever Cloud. Se creó una base de datos llamada grados_pre_pos con una tabla graduados, estructurando así la información obtenida de manera organizada y llevó a cabo un análisis detallado y sistemático de los datos extraídos de la tabla web.

Además, se identificó un párrafo relevante en un documento sobre posgrados en Colombia. Utilizando herramientas como Google Colab.

En primer lugar, se empleó Python para extraer información relevante (Título, parrafo, autor, etc.) de una página web que analiza las tendencias de estudios de posgrado en Colombia. Para este propósito, se implementó el siguiente código:

Se importan las librerías.

In [ ]:
import requests
from bs4 import BeautifulSoup
import time

Se agregan las variables iniciales.

  • url: La URL de la página web desde donde se extraerán los datos.

  • archivo_datos: Nombre del archivo donde se guardarán los datos extraídos.

In [ ]:
url = 'https://www.unisabana.edu.co/portaldenoticias/al-dia/la-tendencia-de-los-estudios-de-posgrado-en-colombia/'
archivo_datos = 'datos_extraidos_parrafo.txt'

El bloque try-except se emplea para ejecutar el código principal de manera segura, capturando y manejando posibles errores durante la solicitud HTTP (requests.get(url)), el parsing con BeautifulSoup, la manipulación de datos y la escritura en archivo. Además, se proporciona retroalimentación al usuario mostrando el progreso y mensajes de error o éxito en la extracción de datos. Se añade un pequeño retardo (time.sleep(1)) entre solicitudes para no sobrecargar el servidor.

In [ ]:
try:
    result = requests.get(url)

    if result.status_code == 200:
        soup = BeautifulSoup(result.text, 'html.parser')
        titulo = soup.find('title').get_text(strip=True)
        print('Título:', titulo)
        parrafos = soup.find_all('p')

        if parrafos:
            contenido_parrafo = '\n'.join([p.get_text(strip=True) for p in parrafos])
            print('Contenido del párrafo:\n', contenido_parrafo)
            with open(archivo_datos, 'w', encoding='utf-8') as file:
                file.write('Título: ' + titulo + '\n\n')
                file.write('Contenido del párrafo:\n\n' + contenido_parrafo + '\n')

        else:
            print('No se encontraron párrafos en la página.')

    else:
        print(f'Error al acceder a {url}: Código de estado {result.status_code}')

    time.sleep(1)

except Exception as e:
    print(f'Ocurrió un error al procesar {url}: {e}')
Título: Conozca la tendencia de los estudios de posgrado en Colombia
Contenido del párrafo:
 Por Jorge David Páez Monroy, director General del Instituto Forum.
De acuerdo con los comportamientos y las cifras que se observan en el Sistema de Información del Ministerio de Educación Nacional, y con los resultados en el crecimiento de programas de formación posgradual en las universidades, la tendencia sigue siendo hacia especializaciones y maestrías de profundización innovadoras, que estén en diálogo con las necesidades empresariales y que sean pertinentes con la formación de calidad, al atender ejes y competencias que respondan al mercado laboral, entre las cuales se deben tener en cuenta las formas de pensar para la resolución de problemas con creatividad y de manera ágil, así como la forma de enseñar a convivir en el mundo con responsabilidad personal y social, articulándose con la ciudadanía global. Programas con mecanismos para integrarse al mundo, como las tecnologías digitales, la información y el manejo eficiente de los datos, y con relacionamiento colaborativo para la construcción conjunta de nuevo conocimiento que lleve al crecimiento del país. Es importante tener en nuestro país posgrados virtuales, presenciales o la combinación de los anteriores.
Se puede decir que las especializaciones, maestrías y MBA favorecen la adquisición de nuevas competencias, de manera ágil y contundente, para afrontar los requerimientos del mercado laboral y las competencias tan apetecidas por los empresarios, por lo cual son tan atractivas para estudiantes jóvenes que desean contar con conocimientos, capacidades y actitudes para competir en esta cuarta parte del siglo XXI de manera pertinente. Continúan en crecimiento los posgrados en las áreas de gestión, gerencia y administración.
Desde hace varios años se viene observando la tendencia de crecimiento de la formación en posgrados mediante los procesos llevados on line a nivel mundial, dando mayores oportunidades de abrirnos al mundo del conocimiento al romper fronteras, con la posibilidad de acceder a otras culturas y construir alternativas de solución de problemas en el sector productivo de manera colectiva,compartiendo o aprendiendo de las buenas prácticas de la formación posgradual, a partir de nuevas modalidades y metodologías para gestionar y adquirir conocimiento.
Colombia lleva varios años en esta modalidad; sin embargo, ha sido tímida en el desarrollo de estos procesos, quizá por la calificación que se le tenía a esta formación “de baja calidad”. Es así como se ha constituido para el país en un reto, pero también en una solución en el modo de educar. Se sabe que, incluso antes de la emergencia sanitaria causada por el COVID-19, los modelos virtuales en la educación superior en Colombia venían desarrollándose en el marco del aseguramiento de la calidad, atendiendo a las demandas globales de la educación superior, tal como lo han solicitado decretos que rigen la educación superior y que, hoy por hoy, se hacen explícitos en el Decreto 1330 del 25 de julio de 2019, en el cual se invita a una realidad de inclusión, equidad y fortalecimiento de la internacionalización, con las condiciones de calidad requeridas para ser competitivos en este tipo de modalidad de formación posgradual.
Se puede decir que las especializaciones, maestrías y MBA favorecen la adquisición de nuevas competencias, de manera ágil y contundente, para afrontar los requerimientos del mercado laboral.
La formación posgradual de los profesionales a partir de esta modalidad se abre a un mundo de posibilidades. Por un lado, la oportunidad y el espacio de flexibilidad para los estudiantes de posgrado que desean continuar sus estudios con un manejo del tiempo y, por el otro, al garantizarles el poder responder a competencias requeridas por el mercado laboral, que sin duda alguna se dan en su formación, como el manejo de datos en la era digital, las comunicaciones y el conocimiento digitales, la gestión de la información, el trabajo colaborativo y en red.
Es muy claro que la educación virtual es todo un modelo de calidad y que, sin duda alguna, con esta oportunidad de formación se fortalecerá el eje de competitividad para el país en la formación del talento humano.
La comunidad universitaria de posgrados cambió el paradigma de una clase presencial por la metodología remota o Hyflex, y por unas metodologías en las cuales, tanto quien aprende como quien enseña, toma consciencia de sus propias ideas como un primer paso hacia su transformación y la resolución de problemas reales, en los que se aplique la relevancia práctica en beneficio de las personas, las organizaciones y, por ende, de la sociedad.
Para seguir creciendo, el camino es continuar el proceso de evolucionar apoyados en la idea de una universidad de tercera generación, que cuente con un portafolio ágil, un escalamiento del sistema de aprendizaje, una arquitectura para la investigación y que se caracterice por ser una organización innovadora. Esta nueva forma de hacer las cosas es un aprendizaje constante que lleva a un mejoramiento continuo, en donde lo importante es tener claro que las circunstancias cambian lo que hacemos, pero nunca lo que somos.
Universidad de La Sabana.
Código SNIES 1711Personería Jurídica:Resolución 130 del 14 de enero de 1980. Ministerio de Educación Nacional.
Carácter académico: universidad.
Síguenos en nuestras redes

Sala de PrensaUnidades AcadémicasDonacionesPolítica de Protección de datosPolítica de CookiesProtocolo de atención para casos de acoso, violencia sexual y basada en género, así como de comportamientos que sean contrarios a los principios fundamentales de la Universidad o enfrentan la dignidad de cualquiera de los miembros de la comunidad univesitaria
Contacto para notificaciones legales
Si tiene alguna notificación legal puede enviarla al correo: notificacioneslegales@unisabana.edu.co
Institución de educación superior sujeta a inspección y vigilancia por el Ministerio de Educación Nacional.Copyright 2017. Universidad de La Sabana. Todos los derechos reservados.Campus del Puente del Común, Km. 7, Autopista Norte de Bogotá. Chía, Cundinamarca, Colombia.Contact Center: (601) 861 5555 / 861 6666. Apartado: 53753, Bogotá.
Al navegar en este sitio web, usted acepta el uso de cookies y el tratamiento de sus datos personales por parte de la Universidad conforme a su política de cookies y la política de protección de datos personales. En cualquier momento podrá configurar el uso de cookies en su ordenador, y para ejercer sus derechos de protección de datos personales puede hacerlo a través de los canales habilitados como el correoprotecciondedatos@unisabana.edu.coprotecciondedatos@unisabana.edu.co

En segundo lugar, se utilizó otro web scraping para extraer datos de una tabla de una página web relacionada con los graduados de pregrado y posgrado en Colombia de los años 2020 al 2022. Para almacenar y gestionar estos datos, se configuró una base de datos MySQL utilizando XAMPP. A continuación se explica paso a paso:

1. Inicio de MySQL y creación de base de datos:

  • Para comenzar, se accede a MySQL desde la línea de comandos con el siguiente comando: "mysql -h localhost -u root -p"

  • Luego, se muestra la lista de bases de datos existentes con: "SHOW DATABASES;"

  • Para utilizar esta base de datos recién creada, se ejecuta: "USE Graduados_Pre_Pos;"

2. Creación de la tabla graduados: Se define una tabla llamada graduados con las siguientes columnas:

  • id: Identificador único para cada registro.

  • vigencia: Año de graduación (2020, 2021, 2022). nombre_facultad: Nombre de la facultad donde se graduaron los estudiantes.

  • nombre_programa: Nombre del programa académico (carrera, especialización, maestría, etc.).

  • jornada: Jornada en la que se cursó el programa (diurna, nocturna, etc.).

  • modalidad: Modalidad de estudio (presencial, virtual, semipresencial, etc.).

  • no_de_graduados: Número de graduados en esa categoría.

El script SQL para crear esta tabla es el siguiente: "CREATE TABLE graduados ( id INT(11) DEFAULT NULL, vigencia VARCHAR(100) DEFAULT NULL, nombre_facultad VARCHAR(100) DEFAULT NULL, nombre_programa VARCHAR(100) DEFAULT NULL, jornada VARCHAR(100) DEFAULT NULL, modalidad VARCHAR(100) DEFAULT NULL, no_de_graduados INT DEFAULT NULL, PRIMARY KEY (id) );"

3. Descripción de la tabla graduados: Para verificar la estructura de la tabla recién creada y asegurarse de que se han definido correctamente todas las columnas, se utiliza el comando "DESCRIBE graduados;". Esto muestra una descripción detallada de cada columna, incluyendo el tipo de dato y las restricciones de clave primaria.

Después de configurar y crear la estructura de la base de datos MySQL utilizando XAMPP, se desarrolló un código en Python para automatizar la extracción de información desde una API externa.

Este código está diseñado para obtener datos relacionados con los graduados de pregrado y posgrado en Colombia para los años 2020 al 2022. Utilizando las bibliotecas mysql.connector y requests, el script se encarga de realizar solicitudes HTTP a la API, procesar los datos JSON recibidos y almacenarlos en la base de datos MySQL previamente configurada.

La función del código es asegurar que los datos sean recuperados de manera eficiente y organizada, facilitando su posterior análisis y uso dentro de aplicaciones o sistemas de información. A continuación se explica su funcionamiento y propósito:

1. Importación de librerías: Se importan las librerías necesarias, mysql.connector para interactuar con la base de datos MySQL y requests para hacer solicitudes HTTP a la API que contiene los datos.

2. Configuración de la base de datos: Se establecen los parámetros de configuración para la conexión a la base de datos MySQL (host, user, password, database).

3. Consulta SQL para inserción de datos: Se define la consulta SQL (sql_insert) que insertará los datos obtenidos de la API en la tabla graduados.

4. URL de la API: Se especifica la URL de la API (api_url) que proporciona los datos en formato JSON.

5. Función process_row: Esta función procesa cada fila de datos del JSON. Extrae los campos relevantes (vigencia, nombre_facultad, nombre_programa, jornada, modalidad, no_de_graduados), los prepara como una tupla y ejecuta la consulta SQL para insertarlos en la base de datos mediante el cursor.

6. Función process_api: Esta función realiza la solicitud HTTP a la API, procesa los datos JSON obtenidos llamando a process_row para cada fila y finalmente realiza un commit en la base de datos para guardar los cambios.

7. Función principal main: La función principal establece una conexión a la base de datos MySQL, inicializa un cursor y llama a process_api para comenzar el proceso de extracción y almacenamiento de datos.

8. Manejo de errores: El código está diseñado para manejar varios tipos de errores, incluidos errores de solicitud HTTP (requests.RequestException), errores de MySQL (mysql.connector.Error) y cualquier otra excepción general (Exception), proporcionando mensajes específicos para cada caso de error.

El código de python es el siguiente:

In [ ]:
# import mysql.connector
# import requests

# Configuración de la base de datos MySQL
# db_config = {
#     "host": "localhost",
#     "user": "root",
#     "password": "",
#     "database": "Graduados_Pre_Pos"
# }

# Consulta SQL para insertar datos en la tabla graduados
# sql_insert = """
#     INSERT INTO grado (id, vigencia, nombre_facultad, nombre_programa, jornada, modalidad, no_de_graduados)
#     VALUES (%s, %s, %s, %s, %s, %s, %s)
# """

# URL de la API que proporciona los datos en formato JSON
# api_url = 'https://www.datos.gov.co/resource/gdwy-s35v.json'

# Función para procesar cada fila de datos del JSON
# def process_row(row, cursor):
#     id = int(row['id']) if 'id' in row and row['id'].isdigit() else None
#     vigencia = row['vigencia']
#     nombre_facultad = row['nombre_facultad']
#     nombre_programa = row['nombre_programa']
#     jornada = row['jornada']
#     modalidad = row['modalidad']
#     no_de_graduados = int(row['no_de_graduados']) if 'no_de_graduados' in row else None

#     row_data = (id, vigencia, nombre_facultad, nombre_programa, jornada, modalidad, no_de_graduados)
#     cursor.execute(sql_insert, row_data)

# Función para procesar la API y almacenar los datos en MySQL
# def process_api(api_url, cursor, db):
#     try:
#         response = requests.get(api_url)
#         response.raise_for_status()  # Lanza una excepción para códigos de estado de respuesta HTTP no exitosos

#         data = response.json()
#         for row in data:
#             process_row(row, cursor)

#         db.commit()
#         print(f'Datos de la tabla exportados correctamente a la base de datos MySQL')

#     except requests.RequestException as e:
#         print(f'Error de solicitud para {api_url}: {str(e)}')
#     except mysql.connector.Error as e:
#         print(f'Error de MySQL: {str(e)}')
#     except Exception as e:
#         print(f'Error general: {str(e)}')

# Función principal
# def main():
#     try:
#         db = mysql.connector.connect(**db_config)
#         cursor = db.cursor()

#         process_api(api_url, cursor, db)

#     except mysql.connector.Error as e:
#         print(f'Error de MySQL: {str(e)}')
#     finally:
#         if 'cursor' in locals() and cursor is not None:
#             cursor.close()
#         if 'db' in locals() and db.is_connected():
#             db.close()

# if __name__ == "__main__":
#     main()

Resultado en python:

image.png

Después de extraer los datos, procedimos a MySQL, donde almacenamos los resultados del web scraping.

image.png

Después de extraer los datos, se procedió a utilizar Clever Cloud para subir los datos en línea. Para ello, se realizaron los siguientes pasos:

1. Se seleccionó la opción "Create" y luego "Add-on".

image.png

2. Se eligió el complemento MySQL.

image.png

3. Se optó por la versión gratuita "DEV".

image.png

4. Se asignó el nombre "grados" a la base de datos y se seleccionó la ubicación "Montreal".

image.png

5. Se accedió a la información de la base de datos y se ingresó a PHPMyAdmin.

image.png

image.png

6. Usando PHPMyAdmin se ingresó al servidor.

image.png

7. Se copió la primera parte del script de creación de la tabla "graduados" en el editor SQL.

image.png

8. Se procedió con la ejecución de la consulta SQL para crear la tabla.

image.png

9. Se verificó la estructura de la tabla graduados y se confirmó su creación.

image.png

image.png

10. Se copió desde el comando "INSERT INTO" hasta el final de los datos extraídos.

image.png

11. Se pegó el script SQL en el editor de SQL de Clever Cloud y se ejecutó.

image.png

12. Se realizó una revisión final en el panel de administración para confirmar que los datos se cargaron correctamente.

image.png

Después de cargar los datos en Clever Cloud, se pueden realizar análisis de datos mediante los siguientes ejercicios:

Se instala mysql-connector-python para conectar MySQL.

In [ ]:
pip install mysql-connector-python
Collecting mysql-connector-python
  Downloading mysql_connector_python-9.0.0-cp310-cp310-manylinux_2_17_x86_64.whl.metadata (2.0 kB)
Downloading mysql_connector_python-9.0.0-cp310-cp310-manylinux_2_17_x86_64.whl (19.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 19.3/19.3 MB 37.2 MB/s eta 0:00:00
Installing collected packages: mysql-connector-python
Successfully installed mysql-connector-python-9.0.0

Se importa bibliotecas para análisis gráfico y datos.

In [ ]:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import mysql.connector
import numpy as np

Se define la función para conectar MySQL.

In [ ]:
def connect_to_database():
    return mysql.connector.connect(
        host="bnvbikebwlzc7dpiqrxa-mysql.services.clever-cloud.com",
        database="bnvbikebwlzc7dpiqrxa",
        user="upibrhhbw3vgse5z",
        password="3HMRCE2U6P6d081q7VcC"
    )

Análisis de graduados por programa¶

Se procede a conecta MySQL, se ejecuta la consulta y se devuelve resultados como DataFrame.

In [ ]:
def run_query(query1):
    db = connect_to_database()
    cursor = db.cursor()
    cursor.execute(query1)
    result = cursor.fetchall()
    cursor.close()
    db.close()
    return pd.DataFrame(result)

La consulta query1 selecciona los programas académicos cuyos nombres comienzan con "maes", "especi" o "doc", calculando la suma total de graduados para cada programa. Los resultados se agrupan por nombre de programa y se ordenan de manera descendente según el total de graduados. Finalmente, se limita la salida a los 10 programas con el mayor número de graduados. La consulta se ejecuta utilizando la función run_query(query1), y los resultados se almacenan en el DataFrame df1 para su posterior análisis y visualización.

In [ ]:
query1 = """
SELECT nombre_programa, SUM(no_de_graduados) AS total_graduados
FROM graduados
WHERE nombre_programa LIKE 'maes%' OR nombre_programa LIKE 'especi%' OR nombre_programa LIKE 'doc%'
GROUP BY nombre_programa
ORDER BY total_graduados DESC
LIMIT 10;
"""
df1 = run_query(query1)

Se realiza un gráfico de barras horizontal personalizado.

In [ ]:
plt.figure(figsize=(10, 8))
plt.barh(df1[0], df1[1], color='blue', edgecolor='black')
plt.xlabel('Número de Graduados')
plt.ylabel('Programa')
plt.title('Programas con Mayor Número de Graduados')
plt.gca().invert_yaxis()
plt.show()

Conclusión: El análisis del gráfico programas con mayor número de graduados en Colombia (2020-2022), se observa una clara tendencia hacia la preferencia por programas de posgrado relacionados con las áreas de administración, negocios y educación. Esta inclinación se observa en la cantidad de graduados en estos programas, lo que refleja su alta demanda y las atractivas oportunidades laborales que ofrecen en el contexto colombiano.

Por otro lado, los programas de especialización muestran un número superior de graduados en comparación de los programas de maestría, posiblemente debido a su duración más corta y costos más accesibles en relación con las maestrías.

Análisis de posgrados en ingenierías¶

Se procede a conecta MySQL, se ejecuta la consulta y se devuelve resultados como DataFrame.

In [ ]:
def run_query(query2):
    db = connect_to_database()
    cursor = db.cursor()
    cursor.execute(query2)
    result = cursor.fetchall()
    cursor.close()
    db.close()
    return result

El código ejecuta una consulta SQL, query2, para obtener el nombre de programas de posgrado en ingeniería y el total de graduados de cada programa. Utiliza condiciones LIKE para seleccionar programas cuyos nombres comienzan con "maestri", "espec", o "doc" seguidos de "Ingeniería". Los resultados se agrupan por nombre de programa y se ordenan de manera descendente según el total de graduados.

In [ ]:
query2 = """
SELECT nombre_programa, SUM(no_de_graduados) AS total_graduados
FROM graduados
WHERE (nombre_programa LIKE 'maestri%Ingeniería%'
    OR nombre_programa LIKE 'espec%Ingeniería%'
    OR nombre_programa LIKE 'doc%Ingeniería%')
GROUP BY nombre_programa
ORDER BY total_graduados DESC
LIMIT 10;
"""
result = run_query(query2)

Se realiza un gráfico de barras horizontal personalizado.

In [ ]:
df = pd.DataFrame(result, columns=['nombre_programa', 'total_graduados'])

plt.figure(figsize=(12, 8))
plt.barh(df['nombre_programa'], df['total_graduados'], color='gold', edgecolor='black')
plt.xlabel('Número de Graduados')
plt.ylabel('Programa de Estudio')
plt.title('Programas con mayor Número de Graduados en Ingenierías (Maestrías, Especializaciones y Doctorados)')
plt.gca().invert_yaxis()
plt.show()

Conclusión: El análisis del gráfico sobre los programas con mayor número de graduados en ingenierías en Colombia revela una tendencia predominante hacia las maestrías, seguidas de especializaciones y doctorados.

Esto refleja una alta demanda de profesionales altamente capacitados en diversas disciplinas de la ingeniería. Los programas más populares incluyen especialización en ingeniería de producción y operaciones, maestría en ingeniería ambiental y maestría en ingeniería, destacando la preferencia por formaciones generalistas y especializadas que abordan áreas clave como la ambiental, la empresarial y la de infraestructura vial.

Análisis de graduados por año académico¶

Se procede a conecta MySQL, se ejecuta la consulta y se devuelve resultados como DataFrame.

In [ ]:
def run_query(query3):
    db = connect_to_database()
    cursor = db.cursor()
    cursor.execute(query3)
    result = cursor.fetchall()
    cursor.close()
    return result

El código ejecuta una consulta SQL, query3, para obtener la suma total de graduados por año (vigencia) desde la tabla graduados. Los resultados se agrupan por año y se calcula el total de graduados para cada año.

In [ ]:
query3 = """
SELECT vigencia, SUM(no_de_graduados) AS total_graduados
FROM graduados
GROUP BY vigencia;
"""
result = run_query(query3)

Se realiza un gráfico de barras por año.

In [ ]:
df = pd.DataFrame(result, columns=['vigencia', 'total_graduados'])
print(df)

plt.figure(figsize=(10, 8))
colors = plt.get_cmap('tab10').colors
bars = plt.bar(df['vigencia'], df['total_graduados'], color=colors[:len(df['vigencia'])], edgecolor='black')

for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, yval, yval, ha='center', va='bottom', fontsize=12)

plt.xlabel('Vigencia')
plt.ylabel('Número de Graduados')
plt.title('Número de Graduados por Vigencia')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
                 vigencia total_graduados
0    PRIMER SEMESTRE 2020             394
1  SEGUNDO SEMESTRE  2020            3852
2   PRIMER SEMESTRE  2021            2433
3   SEGUNDO SEMESTRE 2021            1153
4    PRIMER SEMESTRE 2022            1360

Conclusión: El análisis del gráfico número de graduados por vigencia revela una tendencia decreciente en el número de graduados a lo largo de cinco periodos desde el Primer Semestre de 2020 hasta el Primer Semestre de 2022. Este descenso puede atribuirse a varios factores como la pandemia de COVID-19, que probablemente afectó la asistencia y finalización de estudios debido a restricciones y medidas sanitarias. Además, cambios en las políticas de la institución y condiciones económicas adversas podrían haber contribuido a esta disminución. Estos elementos sugieren la necesidad de adaptación y apoyo continuo para los estudiantes en tiempos de crisis y cambios institucionales.

ENTREGA ACTIVIDAD 4¶

Daniela Stephania Lombana Garcia

Para llevar a cabo la visualización de datos, se emplearon los datos combinados obtenidos mediante el merge. Estos datos fueron importados a Tableau Public, una potente herramienta de visualización de datos. En Tableau Public, se realizaron varias representaciones gráficas para analizar la información de manera efectiva. Se crearon gráficos de barras para observar las variaciones en diferentes categorías y gráficos circulares para representar proporciones de manera intuitiva. Además, se presentaron datos en tablas para proporcionar una visión detallada y numérica de los resultados. Esta combinación de gráficos y tablas permitió una comprensión más profunda de los datos y facilitó la interpretación de las tendencias y patrones presentes en la información analizada.

Para llevar a cabo la visualización de datos, se siguieron los siguientes pasos:

1. Acceso a Tableau Public: Primero, nos dirigimos a la página de Tableau Public y seleccionamos la opción para crear un nuevo proyecto.

image.png

2. Carga de datos: Luego, cargamos los datos combinados obtenidos mediante el merge. En esta etapa, verificamos que las columnas requeridas estuvieran presentes y que la información se hubiera importado correctamente.

image.png

3. Creación de visualizaciones: A continuación, comenzamos a crear diversas representaciones gráficas. Se generaron tablas para mostrar los datos de manera detallada y se crearon gráficos de barras y gráficos circulares para visualizar las tendencias y proporciones de manera efectiva.

image.png

4. Exploración del Dashboard: Para ver los resultados finales y explorar el dashboard completo, por favor, acceda al enlace proporcionado. Este enlace le permitirá visualizar las visualizaciones y tablas interactivas creadas en Tableau Public.

Acceda al dashboard haciendo clic en el enlace "Tableau Public Dashboard Posgrados":

Tableau Public Dashboard Posgrados